package com.example.demo.Handel;
import com.example.demo.pojo.Project;
import com.example.demo.pojo.Res;
import org.springframework.stereotype.Controller;

import java.util.List;
@Controller
public class demoHandel {
//银行家算法实现
    public String banker(List<Object> resList, Integer i, Res request){
//        获取第i个项目
        Project project=(Project) resList.get(i);
//        保存现有资源数量
        Res work=(Res) resList.get(0);
//        定义结果，默认等待
        String res="wait";
//        第一步：检测第i个项目请求是否满足要求
        boolean result=work.sort(request);
        boolean result2=project.getNeed().sort(request);
        if (result&&result2){
//            第二步：假定可以同意第i个项目的资源请求，使用temp暂时进行运算
//            计算、赋值得到分配资源后的数据
            Res tempWork=new Res().minus(work,request);
//            对第i个项目的数据进行赋值，方便之后进行安全性计算；
            Project tempProject =new Project();
            tempProject.setMax(project.getMax());
//            向量之间的加法运算赋值到Allocation
            tempProject.setAllocation(new Res().puls(request,project.getAllocation()));
//            向量之间的减法运算赋值到need
            tempProject.setNeed(new Res().minus(tempProject.getMax(),tempProject.getAllocation()));
            tempProject.setRequest(request);
//            进入安全性算法
            boolean result3=this.security(resList,tempProject, i,tempWork);
            if (result3){
//                如果通过安全性测试则覆盖之前List存放在i的数据；
                resList.remove(resList.get(i));
                resList.add(i,tempProject);
                res="ok";
            }else {
                res="error";
            }
        }
        return res;
    }
//安全性算法实现方法
    private boolean security(List<Object> resList, Project tempProject,Integer i,Res tempWork) {
//        数据资源更新化；
        int[] finish=new int[resList.size()];
        resList.remove(resList.get(i));
        resList.add(i,tempProject);
        for (int j=0;j<resList.size();j++){
            finish[j]=0;
        }
//        从小到大便利need值与tempWork进行比较
        for (int j=1;j<resList.size();j++){
//            哨兵，用来检测每一次循环是否有finish的项目
            int a=0;
            Project temp=(Project) resList.get(j);
            if (tempWork.sort(temp.getNeed())&&finish[j]!=1) {
//                更改tempWork资源；
                tempWork.puls(tempWork,temp.getAllocation());
//                更新finish数据
                finish[j]=1;
//                打印出安全性序列；
                System.out.println("顺序:"+j);
//                哨兵，如果进入此循环且有项目完成则不会进入下一个if判断，再次进入for循环
                a=1;
//                从小到大再次检索符合条件的项目
                j=0;
            }
//            如果循环一遍之后依旧没有出现符合要求的项目，则进入此if进行判断
            if (j==resList.size()-1&&a==0){
                for (int k=1;k<resList.size();k++){
                    if (finish[k]==0){
//                        若有finish值为0，即没有完成则说明此请求不安全；
                        return false;
                    }
                }

            }
        }

        return true;
    }

}
